﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Windows.Forms;

namespace Accesos.BaseDeDatos
{
    public class clsBaseDeDatos
    {
        private SqlCommand sqlComando=new SqlCommand();
        private SqlDataAdapter sqlAdaptador=new SqlDataAdapter();
        private SqlConnection sqlConexion = new SqlConnection(); 
        private SqlParameter mas;
        private string Conexion="";
     

        public clsBaseDeDatos(string pConexion)
        {
            Conexion = pConexion;
            Conectar();
           
        }

        public void ConfigurarProcedimientos(string nomProcedimiento)
        {
            
            this.sqlComando.Connection = this.sqlConexion;
            this.sqlComando.CommandText = nomProcedimiento;
            this.sqlComando.CommandType = CommandType.StoredProcedure;          
           
        }

       //declaraciones de los tipos datos de los parametros de las funciones

           public void DeclaracionVariables( string Parametro, string valor, int numTipo, int numTipoVar)
        {                
           
            mas = new SqlParameter();
            mas.ParameterName = Parametro;
            mas.SqlDbType = TipoVariable(numTipoVar,valor);
          
            mas.Direction = TipoDeParametro(numTipo);           
            sqlComando.Parameters.Add(mas);
            this.sqlAdaptador.SelectCommand = this.sqlComando;
           }


        //Tipo de datos de las variables
        private SqlDbType TipoVariable(int numVar,string val)
        {
            SqlDbType var = new SqlDbType();
            switch (numVar)
            {
                case 1:
                    {
                        mas.SqlValue = val;
                        var = SqlDbType.VarChar;
                        mas.Size = 500;
                        break;
                    }
                case 2:
                    {
                        mas.SqlValue = Convert.ToInt32(val);
                        var = SqlDbType.Int;
                        mas.Size = 5;
                        break;
                    }
                case 3:
                    {
                        mas.Value = Convert.ToDecimal(val);
                        var = SqlDbType.Decimal;
                        break;
                    }
                case 4:
                    {
                        mas.Value = Convert.ToDouble(val);
                        var = SqlDbType.Float;
                        break;
                    }
                case 5:
                    {
                        mas.Value = val;
                        var = SqlDbType.DateTime;
                        mas.Size = 8;
                        break;
                    }
                case 6:
                    {
                        mas.Value = Convert.ToDecimal(val);
                        var = SqlDbType.Money;
                        break;
                    }
               
            }
            return var;
        }

        //Declaracion en un tipo especial de dato Tipo de dato Imagen

        public void DeclaracionVariablesImagen(string Parametro,byte[] imagen)
        {

            mas = new SqlParameter();
            mas.ParameterName = Parametro;
            mas.SqlDbType = SqlDbType.Image;
            mas.Value = imagen;
            mas.Size = 2147483647;
            mas.Direction = ParameterDirection.Input;
            sqlComando.Parameters.Add(mas);
            this.sqlAdaptador.SelectCommand = this.sqlComando;
        }






        //Tipo de parametro si es de salida 1, si es de entrada 2 y si es de entrada y salida 3
        private ParameterDirection TipoDeParametro(int opcion)
        {
            ParameterDirection tipo = new ParameterDirection();
            switch (opcion)
            {
                case 1:
                    {
                        tipo = ParameterDirection.Input;
                        break;
                    }
                case 2:
                    {
                        tipo = ParameterDirection.Output;
                        break;
                    }
                case 3:
                    {
                        tipo = ParameterDirection.InputOutput;
                        break;
                    }
            }
            return tipo;
        }
        //Conectar la base de datos

        public void Conectar()
        {     
            this.sqlConexion.ConnectionString = Conexion;            
            this.sqlConexion.Open();
        }

        //Desconecta la base de datos
        public void Desconectar()
        {
            if (this.sqlConexion.State.Equals(ConnectionState.Open))
            {
                this.sqlConexion.Close();
            }
        }

        //Ejecutar el procedimiento almacenado
        public void ejecutar()
        {
            try
            {
                sqlAdaptador.SelectCommand.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }


        public void ejecutarProcConValor(ColeccionDeDatos setDat)
        {
            try
            {
                sqlAdaptador.SelectCommand.ExecuteNonQuery();
                sqlAdaptador.Fill(setDat.sp_cuentaActiva);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }
        //Devolver el valor de las variables que retornan un valor desde la base de datos
        public object outVar(string Mas)
        { 
        return (object)(sqlAdaptador.SelectCommand.Parameters[Mas].Value);
        }

    }
}
